package ihm.controller;

import com.icesoft.faces.component.ext.RowSelectorEvent;
import dao.QuestionnaireFacadeLocal;
import dao.UtilisateurFacadeLocal;
import entite.EtatEnum;
import entite.Questionnaire;
import entite.Utilisateur;
import ihm.util.Util;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.Iterator;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.mail.MessagingException;
import javax.naming.NamingException;
import metier.GestionQuestionnaireLocal;


@ManagedBean
@ViewScoped
public class DiffusionController implements Serializable {

    private List<Utilisateur> utilisateursNoSelected;
    private Questionnaire questionnaire;
    @EJB
    private UtilisateurFacadeLocal utilisateurFacade;
    @EJB
    private QuestionnaireFacadeLocal questionnaireFacade;
    private boolean affichePopup;
    @ManagedProperty(value = "#{sessionController}")
    private SessionController sessionController;
    @ManagedProperty(value = "#{mailController}")
    private MailController mailController;

     @ManagedProperty(value = "#{questionnaireController}")
    private QuestionnaireController questionnaireController;
  @EJB
    private GestionQuestionnaireLocal gestionQuestionnaire;
    /**
     * Setter mailController
     * @param mailController
     */
    public void setMailController(MailController mailController) {
        this.mailController = mailController;
    }

    /**
     * Constructeur
     */
    public DiffusionController() {
    }

    /**
     * Méthode d'initialisation
     */
    @PostConstruct
    public void init() {
        utilisateursNoSelected = utilisateurFacade.findAll();
    }

    /**
     * Liste des utilisateurs non selectionnés
     * @return Liste des utilisateurs non sélectionnés
     */
    public List<Utilisateur> getUtilisateursNoSelected() {
        return utilisateursNoSelected;
    }

    /**
     * Setter de la liste des utilisateurs non sélectionnés
     * @param utilisateursNoSelected
     */
    public void setUtilisateursNoSelected(List<Utilisateur> utilisateursNoSelected) {
        this.utilisateursNoSelected = utilisateursNoSelected;
    }

    /**
     * Action lancer lors de la selection d'un utilisateur dans la liste
     * @param event
     */
    public void rowSelectionListener(RowSelectorEvent event) {
        for (Iterator<Utilisateur> it = questionnaire.getUtilisateurs().iterator(); it.hasNext();) {
            Utilisateur utilisateur = it.next();
              System.out.println("questionnaire.getUtilisateurs() : " + utilisateur.getNom() + utilisateur.isSelected());
            if (utilisateur.isSelected()) {
                it.remove();
                utilisateursNoSelected.add(utilisateur);
                utilisateur.setSelected(false);
            }
        }
    }

    /**
     * Action lancer lors de la selection d'un utilisateur dans la liste
     * @param event
     */
    public void rowSelectionListener2(RowSelectorEvent event) {
        for (Iterator<Utilisateur> it = utilisateursNoSelected.iterator(); it.hasNext();) {
            Utilisateur utilisateur = it.next();
            System.out.println("utilisateurNoSelected : " + utilisateur.getNom() + utilisateur.isSelected());
            if (utilisateur.isSelected()) {
                it.remove();
                questionnaire.getUtilisateurs().add(utilisateur);
                utilisateur.setSelected(false);
            }
        }

    }

    /**
     * Getter questionnaire
     * @return questionnaire
     */
    public Questionnaire getQuestionnaire() {
        return questionnaire;
    }

    /**
     * Setter questionnaire
     * @param questionnaire
     */
    public void setQuestionnaire(Questionnaire questionnaire) {
        this.questionnaire = questionnaire;
        utilisateursNoSelected.removeAll(questionnaire.getUtilisateurs());
    }

    /**
     * Getter affiche popup
     * @return  true si afficher
     *          false si pas afficher
     */
    public boolean isAffichePopup() {
        return affichePopup;
    }

    /**
     * Setter affichePopup
     * @param affichePopup
     */
    public void setAffichePopup(boolean affichePopup) {
        this.affichePopup = affichePopup;
    }

    /**
     * Methode d'affichage de la popup
     * @param event
     */
    public void togglePopup(ActionEvent event) {
        affichePopup = !affichePopup;
    }

    /**
     * Methode de diffuser des questionnaires (+envoi des mails)
     * @return String null pour rafraichir la page
     */
    public String diffuserQuestionnaire() throws NoSuchAlgorithmException {
        if (questionnaire != null) {
            if (questionnaire.getUtilisateurs() != null && !questionnaire.getUtilisateurs().isEmpty()) {
                questionnaire.setDiffusionRestreinte(true);
                gestionQuestionnaire.modifierQuestionnaire(questionnaire,
                        sessionController.getUtilisateur(), EtatEnum.DIFFUSER);
                try {
                    mailController.envoieMail(questionnaireFacade.edit(questionnaire), "defaut");
                } catch (NamingException ex) {
                    Util.addErrorMessage(null, "Erreur envoie mail : " + ex.getMessage(), FacesContext.getCurrentInstance());
                } catch (MessagingException ex) {
                    Util.addErrorMessage(null, "Erreur envoie mail : " + ex.getMessage(), FacesContext.getCurrentInstance());
                } catch (NoSuchAlgorithmException ex) {
                    Util.addErrorMessage(null, "Erreur envoie mail : " + ex.getMessage(), FacesContext.getCurrentInstance());
                } catch (UnsupportedEncodingException ex) {
                    Util.addErrorMessage(null, "Erreur envoie mail : " + ex.getMessage(), FacesContext.getCurrentInstance());
                } catch (FileNotFoundException ex) {
                    Util.addErrorMessage(null, "Erreur envoie mail : " + ex.getMessage(), FacesContext.getCurrentInstance());
                } catch (IOException ex) {
                    Util.addErrorMessage(null, "Erreur envoie mail : " + ex.getMessage(), FacesContext.getCurrentInstance());
                }

            } else {
                questionnaire.setDiffusionRestreinte(false);
                gestionQuestionnaire.modifierQuestionnaire(questionnaire, 
                        sessionController.getUtilisateur(), EtatEnum.DIFFUSER);
            }
        }
        questionnaireController.setPage("listeQuestionnaires");
        questionnaireController.setFiltreEtatCourant(EtatEnum.DIFFUSER);
        return null;
    }

    /**
     * Setter sessionController
     * @param sessionController
     */
    public void setSessionController(SessionController sessionController) {
        this.sessionController = sessionController;
    }

    public void setQuestionnaireController(QuestionnaireController questionnaireController) {
        this.questionnaireController = questionnaireController;
    }
    
}
